package com.coder.algorithm.offer_2;

import java.util.Locale;

/**
 * 二进制中 1 的个数
 * <p>
 * 5 的二进制 101
 * -5 的二进制（绝对值反码后+1即补码）11111111111111111111111111111011
 *
 * @author yuhushuan
 * @date 2020/6/13 09:25
 */
public class _15_1_NumberOf1InBinary {
    public static void main(String[] args) {
        // 0。
        print(0);

        // 正数（包括边界值 1、0x7FFFFFFF）。
        print(1);
        print(0x7FFFFFFF);

        // 负数（包括边界值 0x80000000、0xFFFFFFF）。
        print(0x80000000);
        print(0xFFFFFFF);
    }

    private static void print(int number) {
        System.out.println(String.format(Locale.getDefault(), "数值为 %d 的二进制：\n%s\n中'1'有 %d 个\n",
                number, Integer.toBinaryString(number), numberOf1_solution2(number)));
    }

    private static int numberOf1_solution1(int n) {
        int count = 0;
        int flag = 1;
        while (flag != 0) {
            if ((n & flag) != 0) {
                count++;
            }
            flag <<= 1;
        }
        return count;
    }

    private static int numberOf1_solution2(int n) {
        int count = 0;
        while (n != 0) {
            ++count;
            n = (n - 1) & n;
        }
        return count;
    }
}
